﻿#region 基本信息

/*
 * 作者：王玉才 (Wang Yucai)
 * 创建日期：2015-03-16 17:40:11
 * 电子邮件：SourceProStudio@outlook.com 或者 MasterDuner@yeah.net
 * 开发工具：Microsoft VisualStudio 2013 Ultimate Edition
 * 
 * 公共语言运行时(CLR)版本：4.0.30319.18444
 * 适用的.NET Framework SDK版本：3.5及其以上版本
 * 
 * 机器名：GLCHQWYCWINW7
 * 用户名：GUOCOLAND\wangyucai
 */

#endregion


using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.IO;
using System.Web.Configuration;
using DeluxeSources.Practices.ObjectContracts.Internal;


namespace DeluxeSources.Practices.ObjectContracts
{
    /// <summary>
    /// <para>
    /// 命名空间：<see cref="DeluxeSources.Practices.ObjectContracts"/>
    /// </para>
    /// <para>
    /// 类型名称：<see cref="ExcelDataItemCollection"/>
    /// </para>
    /// <para>
    /// 此类型(<see cref="ExcelDataItemCollection"/>)仅适用于3.5及其以上版本的.NET Framework SDK。
    /// </para>
    /// <para>
    /// 此类型是密闭的，不可以从此类型继承。
    /// </para>
    /// <para>
    /// © 2015 Wang Yucai.
    /// </para>
    /// </summary>
    /// <remarks>
    /// 此类型是密闭的，不可以从此类型继承。
    /// </remarks>
    public sealed class ExcelDataItemCollection : List<ExcelDataItem>, IList<ExcelDataItem>
    {
        #region 构造函数

        /// <summary>
        /// <para>
        /// <see cref="ExcelDataItemCollection"/>的构造函数：
        /// </para>
        /// <para>
        /// 用于初始化一个<see cref="ExcelDataItemCollection"/>类型的对象实例。
        /// </para>
        /// <para>
        /// 此类型是密闭的，不可以从此类型继承。
        /// </para>
        /// </summary>
        public ExcelDataItemCollection()
        {
        }

        /// <summary>
        /// <para>
        /// <see cref="ExcelDataItemCollection"/>的构造函数：
        /// </para>
        /// <para>
        /// 用于初始化一个<see cref="ExcelDataItemCollection"/>类型的对象实例。
        /// </para>
        /// <para>
        /// 此类型是密闭的，不可以从此类型继承。
        /// </para>
        /// </summary>
        /// <param name="dataSource">数据源。</param>
        public ExcelDataItemCollection(DataTable dataSource)
        {
            foreach (DataRow data in dataSource.Rows)
                this.Add(new ExcelDataItem(data));
        }

        #endregion

        #region GetXmlContract
        /// <summary>
        /// 获取数据源的XML表达式契约。
        /// </summary>
        /// <returns>XML表达式。</returns>
        public string GetXmlContract()
        {
            return new XDataSourceCollectionGenerator() { DataSource = this }.TransformText();
        }
        #endregion

        #region ExecuteExcelQuery
        /// <summary>
        /// 执行Excel查询。
        /// </summary>
        /// <param name="actionId">导入动作唯一标识。</param>
        /// <returns><see cref="ExcelDataItemCollection"/>对象实例。</returns>
        static public ExcelDataItemCollection ExecuteExcelQuery(string actionId)
        {
            string connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=\"Excel 8.0; HDR=Yes; IMEX=1\"",
                Path.Combine(new TemporaryDirectory().BaseDirectory.FullName, string.Format("{0}.xls", actionId)));
            DataSet dataSource = new DataSet("Microsoft Office Excel DataSource");
            using (OleDbConnection excelConnection = new OleDbConnection(connectionString))
            {
                using (OleDbDataAdapter excelDataAdapter = new OleDbDataAdapter("Select * From [Sheet1$]", excelConnection))
                {
                    excelDataAdapter.Fill(dataSource);
                }
            }
            return new ExcelDataItemCollection(dataSource.Tables[0]);
        }
        #endregion

        #region ExecuteImport
        /// <summary>
        /// 执行数据导入。
        /// </summary>
        public void ExecuteImport()
        {
            using (SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["ExampleDb"].ConnectionString))
            {
                try
                {
                    connection.Open();
                    SqlCommand cmd = new SqlCommand("sp_ImportDataFromXlsDataSource", connection) { CommandType = CommandType.StoredProcedure, CommandTimeout = 0 };
                    cmd.Parameters.Add(new SqlParameter("@xDataContract", this.GetXmlContract()) { SqlDbType = SqlDbType.Xml });
                    cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    connection.Close();
                }
            }
        }
        #endregion
    }
}

#region 版权声明

/*
 * Copyright © 2015 Wang Yucai. All rights reserved.
 */

#endregion